package xdu.lz.stage1_basic.chapter1_threadsafe.threadSafe;

public class TestSingleThreadSafe {
    public static class Single {
        private static Single single;
        private static int counter = 0;
        private Single(){

        }

        public static Single getSingle() {
            if(single == null){
                synchronized ("single"){
                    if(single == null){
                        single = new Single();
                        return single;
                    }
                }

            }
            return single;
        }
        public void add(){
            while (counter<=100){
                try {
                    Thread.sleep(10L);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+ "counter = " + counter);
                counter++;
            }

        }
    }

    //单例也会导致线程安全问题：多个线程拿到的虽然是同一个对象，但是调用其方法可以同时进行
    //SpringMVC相当于main，是一个单利，然后用户访问相当于这里的多个线程，Service相当于单利single。
    //用户访问Service相当于多线程访问  单利对象的API，可以同时调用API，会出现线程安全问题。

    public static void main(String[] args) {
        new Thread(()->{
            Single.getSingle().add();
        }).start();
        new Thread(()->{
            Single.getSingle().add();
        }).start();
        new Thread(()->{
            Single.getSingle().add();
        }).start();
        new Thread(()->{
            Single.getSingle().add();
        }).start();
    }
}
